/**
 * @Description 路由鉴权（有无权限访问当前资源）：用户未登录只能访问logon页面，登录成功后便不能在访问login页面，通过token判断
 * @Date 2023/5/25 周四 14:43
 * @Author 酷奇 <vx：17685112557>
 */
import router from '@/router'
import setting from '@/setting'
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import useUserStore from '@/store/modules/user'
import pinia from '@/store'
import { NavigationGuardNext, RouteLocationNormalized } from 'vue-router'

const userStore = useUserStore(pinia)
// 关闭加载效果（小圆球）
NProgress.configure({ showSpinner: false })

/**
 * 全局前置守卫：
 *  to：访问的路由
 *  from：从哪个路由来
 *  next：路由放行函数
 */
router.beforeEach(
  async (
    to: RouteLocationNormalized,
    from: RouteLocationNormalized,
    next: NavigationGuardNext,
  ) => {
    // 切换路由时，修改浏览器标签栏标题为路由名
    document.title = `${setting.title} - ${to.meta.title}`
    // 路由前开启进度条
    NProgress.start()
    const token = localStorage.getItem('token')
    const username = userStore.username
    // 用户登录，用户未登录
    if (token) {
      if (to.path == '/login') {
        next({ path: '/' })
      } else {
        // 若有用户信息，直接放行；若无则获取用户信息，再放行
        if (username) {
          next()
        } else {
          try {
            await userStore.uerInfo()
            next()
          } catch (err) {
            // 执行到这里，则token过期，让用户重新登录
            await userStore.userLogout()
            next({ path: '/login', query: { redirect: to.path } })
          }
        }
      }
    } else {
      // 若访问的是login页面直接放行，否则重定向到login页面
      if (to.path == '/login') {
        next()
      } else {
        // 登录后重定向到要访问的页面
        next({ path: '/login', query: { redirect: to.path } })
      }
    }
  },
)
router.afterEach(() => {
  // next()
  NProgress.done()
})
